package com.xuecheng.media.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xuecheng.media.model.po.MediaProcess;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

/**
 * <p>
 *  Mapper 接口
 * </p>
 *
 * @author itcast
 */
public interface MediaProcessMapper extends BaseMapper<MediaProcess> {

    //如何保证查询到的待处理视频记录不重复

    /**
     * 根据分片参数获取待处理任务
     * @param shardTotal   分片总数
     * @param shardIndex  分片序号
     * @param count  任务数
     * @return
     */

    /**
     *用任务id % 分片总数  如果等于该执行器的分片序号，则执行
     *
     * 同时避免了同一个任务被执行两次，需要额外指定任务状态为--未处理（status = 1）
     *
     * 同时设置失败重试次数小于三次
     */
    @Select("select * from media_process t where t.id % #{shardTotal} = #{shardIndex} and (t.status = '1' or t.status = '3') and t.fail_count < 3 limit #{count}")
    List<MediaProcess> selectListByShardIndex(@Param("shardTotal") int shardTotal,@Param("shardIndex") int shardIndex,@Param("count") int count);


    //基于数据库实现分布式锁

    /**
     * 开启一个任务
     * @param id  任务id
     * @return  更新任务数
     */
    @Update("update media_process m set m.status = '4' where(m.status = '1' or m.status = '3') and m.fail_count < 3 and m.id = #{id}")
    int startTask(@Param("id") long id);

}
